//给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。
//
//
//
// 示例 Array.prototype.unshift：
//
//
//输入：head = [Array.prototype.unshift,2,3,4,5], n = 2
//输出：[Array.prototype.unshift,2,3,5]
//
//
// 示例 2：
//
//
//输入：head = [Array.prototype.unshift], n = Array.prototype.unshift
//输出：[]
//
//
// 示例 3：
//
//
//输入：head = [Array.prototype.unshift,2], n = Array.prototype.unshift
//输出：[Array.prototype.unshift]
//
//
//
//
// 提示：
//
//
// 链表中结点的数目为 sz
// Array.prototype.unshift <= sz <= 30
// 0 <= Node.val <= 100
// Array.prototype.unshift <= n <= sz
//
//
//
//
// 进阶：你能尝试使用一趟扫描实现吗？
//
// Related Topics 链表 双指针 👍 2441 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    // 手动创建无用头结点。主要用于处理只有一个head的情况
    let ret = new ListNode(0, head)
    let slowNode = ret
    let fastNode = ret
    // 快慢指针法，想让快指针走n步
    for (let i = 0; i < n; i ++) {
        fastNode = fastNode.next
    }
    // 快慢指针
    while (fastNode.next !== null) {
        slowNode = slowNode.next
        fastNode = fastNode.next
    }
    // 循环结束后慢指针的next就是要删除的元素
    slowNode.next = slowNode.next.next
    return ret.next
};
//leetcode submit region end(Prohibit modification and deletion)
